home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / games / otoko / source.lzh / FuncEnemy / covern2.c < prev    next >
C/C++ Source or Header  |  1999-06-14  |  5KB  |  205 lines

  1. /* 左右のカバーを開けて弾・その2 */
  2. #include <xsp2lib.h>
  3.  
  4. #include "../otoko.h"
  5. #include "../player.h"
  6. #include "../enemy.h"
  7. #include "../eshot.h"
  8. #include "../effect.h"
  9. #include "../priority.h"
  10. #include "../sound.h"
  11. #include "../psearch.h"
  12. #include "../entry.h"
  13.  
  14.  
  15. #define PALET_MAIN    0x0200
  16.  
  17. #define HP_0    180
  18.  
  19. #define ENTRY_CONTROL_ADD    10    /* entry_control に足す値 */
  20.  
  21. #define wabs(x) ((x) >= 0 ? (short) (x) : (short) -(x))
  22.  
  23. static short EnemyMoveCoverN2 (ENEMY *);
  24. static void EnemyTiniCoverN2 (ENEMY *);
  25.  
  26.  
  27. void EnemyInitCoverN2 (ENEMY * p)
  28. {
  29.     p->vx = 0;
  30.     p->vy = 2 * 65536;
  31.     p->hit_px = 24;
  32.     p->hit_py = 16;
  33.     p->hit_sx = 32;
  34.     p->hit_sy = 16;
  35.     p->hit_cx = 6;
  36.     p->damage = 0;
  37.     p->flash = 0;
  38.     p->hp = HP_0;
  39.     p->pt = obj_covern;
  40.     p->seq = 0;
  41.     p->core_pt = sp_core01;
  42.     p->core_info = PALET_CORE_BLUE | PRIORITY_BOSS;
  43.     p->func_enemy_move = EnemyMoveCoverN2;
  44.     p->func_enemy_tini = EnemyTiniCoverN2;
  45.  
  46.     entry_control += ENTRY_CONTROL_ADD;
  47. }
  48.  
  49.  
  50.  
  51. static short EnemyMoveCoverN2 (ENEMY * p)
  52. {
  53.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  54.     p->x = (p->lx += p->vx) >> 16;
  55.     p->y = (p->ly += p->vy) >> 16;
  56.  
  57.     switch (p->seq) {
  58.  
  59.     case 0:
  60.         if (p->y > 16)
  61.             p->seq++;
  62.         break;
  63.  
  64.     case 1:
  65.         if (p->vy > 16384) {
  66.             p->vy -= 4096;
  67.         } else {
  68.             p->seq++;
  69.             p->s_work = p->s_work2 = 0;
  70.         }
  71.         break;
  72.  
  73.     case 2:
  74.         /* 攻撃処理 */
  75.         switch (p->s_work) {
  76.         case 0:    /* カバー開く */
  77.             p->pt++;
  78.             if (p->pt >= obj_covern + 14) {    /* カバー開ききったら */
  79.                 p->s_work++;
  80.                 p->s_work2 = p->s_work3 = 0;
  81.                 p->core_info = PALET_CORE_RED | PRIORITY_BOSS;
  82.                 SoundSetSE (SE_LOCK);
  83.             }
  84.             break;
  85.         case 1:
  86.             /* 斜め弾 */
  87.             switch (p->s_work2++) {
  88. #define INTERVAL1_1    14
  89. #define SPEED_SHOT1_1    12
  90.             case INTERVAL1_1 * 1:
  91.                 /* 自機とX座標の差が小さい時のみ斜め弾 */
  92.                 if (wabs (player->x - p->x) < 64) {
  93.                     p->s_angle = psearch (p->x - 16, p->y) - 2;    /* 自機の方向をサーチ */
  94.                     p->s_angle2 = psearch (p->x + 16, p->y) + 2;    /* 自機の方向をサーチ */
  95.                     p->cwork = !0;
  96.                 } else {
  97.                     p->cwork = 0;
  98.                 }
  99.             case INTERVAL1_1 * 2:
  100.             case INTERVAL1_1 * 3:
  101.             case INTERVAL1_1 * 4:
  102.             case INTERVAL1_1 * 5:
  103.                 if (p->cwork) {
  104.                     EshotInit (ESHOT_NRG02, p->x - 16, p->y + 1, SPEED_SHOT1_1, p->s_angle, 0);
  105.                     EshotInit (ESHOT_NRG02, p->x + 16, p->y + 1, SPEED_SHOT1_1, p->s_angle2, 0);
  106.                     SoundSetSE (SE_ESHOT_M);    /* 敵ショット音 */
  107.                 }
  108.                 break;
  109.             case INTERVAL1_1 * 9:
  110.                 p->s_work++;
  111.                 break;
  112.             }
  113. #define INTERVAL1_2    25
  114. #define SPEED_SHOT1_2    8
  115.             if (p->s_work3++ > INTERVAL1_2) {
  116.                 char a = psearch (p->x, p->y);    /* 自機の方向をサーチ */
  117.                 p->s_work3 = 0;
  118.                 EshotInit (ESHOT_NRG04, p->x, p->y, SPEED_SHOT1_2, a, 0);
  119.                 EshotInit (ESHOT_NRG04, p->x, p->y, SPEED_SHOT1_2, a + 24, 0);
  120.                 EshotInit (ESHOT_NRG04, p->x, p->y, SPEED_SHOT1_2, a - 24, 0);
  121.                 SoundSetSE (SE_ESHOT);    /* 敵ショット音 */
  122.             }
  123.             break;
  124.         case 2:    /* カバー閉じる */
  125.             if (p->pt > obj_covern) {
  126.                 p->pt--;
  127.             } else {
  128.                 p->core_info = PALET_CORE_BLUE | PRIORITY_BOSS;
  129.                 SoundSetSE (SE_LOCK);
  130.                 if (SHORT_LY > 160) {
  131.                     p->seq++;
  132.                 } else {
  133.                     p->s_work++;
  134.                     p->s_work2 = 0;
  135.                 }
  136.             }
  137.             break;
  138.         case 3:    /* しばらく待つ */
  139. #define INTERVAL1_3    25
  140.             if (p->s_work2++ > INTERVAL1_3) {
  141.                 p->s_work = 0;    /* 最初に戻る */
  142.             }
  143.             break;
  144.         }
  145.         break;
  146.  
  147.         /* 撤退 */
  148.     case 3:
  149.         if (SHORT_VY < 1)
  150.             p->vy += 4096;
  151.         /* 画面外に出たら消去 */
  152.         if (SHORT_LY > 256 + 32 + 16)
  153.             return (-1);    /* 消去 */
  154.         break;
  155.     }
  156.  
  157.     /* 自機ショットに当たった時の処理 */
  158.     if (p->damage) {
  159.         if (p->damage_core) {
  160.             SoundSetSE (SE_CORE_DAMAGE);
  161.             p->info = PALET_RED | PRIORITY_BOSS;
  162.             p->damage_core = 0;
  163.         } else {
  164.             SoundSetSE (SE_DAMAGE);
  165.             p->info = PALET_DAMAGE | PRIORITY_BOSS;
  166.         }
  167.         if ((p->hp -= p->damage) <= 0) {
  168.             EffectInit (EFFECT_EXPL, 0, p->x, p->y);
  169.             SoundSetSE (SE_EXPL_M);    /* 中ボス爆発音 */
  170.             if (p->core_info == (PALET_CORE_RED | PRIORITY_BOSS))
  171.                 EffectInit (EFFECT_POINTS_RED, POINTS_1200, p->x, p->y);
  172.             else
  173.                 EffectInit (EFFECT_POINTS_BLUE, POINTS_600, p->x, p->y);
  174.             if (disp_level == DISP_LEVEL_HIGH)
  175.                 EffectInit (EFFECT_HAHENMINI, 0, p->x, p->y);
  176.             return (-1);    /* 消去 */
  177.         }
  178.         p->damage = 0;
  179.         p->flash = TIMER_FLASH_DAMAGE;
  180.     } else {
  181.         if ((p->flash++ > TIMER_FLASH_RED) && (p->hp < 80)) {
  182.             p->info = PALET_RED | PRIORITY_BOSS;
  183.             if (p->flash > TIMER_FLASH_NORMAL)
  184.                 p->flash = 0;
  185.         } else {
  186.             p->info = PALET_MAIN | PRIORITY_BOSS;
  187.         }
  188.     }
  189.     xobj_set_st (p);
  190.  
  191.     /* コアの表示 */
  192.     p->core_x = p->x - 8;    /* コアの中心は (-8,-12) ドットずれる */
  193.     p->core_y = p->y - 12;
  194.     xsp_set_st (&(p->core_x));
  195.  
  196.     return (0);
  197. }
  198.  
  199.  
  200.  
  201. static void EnemyTiniCoverN2 (ENEMY * p)
  202. {
  203.     entry_control -= ENTRY_CONTROL_ADD;
  204. }
  205.